package game;

import game.joueur.jeton.AucunJetonUtilisableException;
import game.joueur.Joueur;
import game.joueur.JoueurFactory;
import game.joueur.JoueurFactoryInterface;
import game.joueur.SimulationInteligenceJoueur;
import game.plateau.Plateau;
import game.plateau.PlateauImpl;
import game.plateau.cartes.Carte;
import game.plateau.cartes.CarteFactory;
import game.plateau.cartes.CarteFactoryInterface;
import game.plateau.cartes.CarteOccupeeException;
import game.support.Cochon;
import game.support.CochonFactory;
import game.support.CochonFactoryInterface;
import game.support.DernierEmplacementAtteintException;
import game.support.Emplacement;
import game.support.EmplacementFactory;
import game.support.EmplacementFactoryInterface;
import java.util.Iterator;

public class Runner {

    private Plateau plateau;

    public Runner() {
        this.initialiser();
    }

    private void initialiser() {
        System.out.println("Initisalisation du jeu : ");
        this.plateau = new PlateauImpl();

        CarteFactoryInterface carteFactory = new CarteFactory();
        EmplacementFactoryInterface efi = new EmplacementFactory();
        Emplacement emplacementDepart = efi.create();
        Carte carteDepart = carteFactory.create();

        carteDepart.ajouterEmplacement(emplacementDepart);

        CochonFactoryInterface cochonFactory = new CochonFactory(emplacementDepart);

        Carte currentCarte = null;
        for(int i=0; i<8; i++) {
            currentCarte = carteFactory.create();
            if (i == 0) { carteDepart.ajouteALaSuite(currentCarte); }
            plateau.ajouterCarte(currentCarte);
        }


        JoueurFactoryInterface pfi = new JoueurFactory(cochonFactory);

        for (int j=0; j < 2; j++) {
            plateau.addPlayer(pfi.create());
        }
    }

    public void run() {
        System.out.println("-- Début du jeu --");
        Joueur joueurCourant = null;
        SimulationInteligenceJoueur simulationJoueur = new SimulationInteligenceJoueur();
        
        while (plateau.nombreDeJoueurs() > 0) {
            Iterator<Joueur> iterateurJoueur = plateau.iterateurJoueurs();
            while (iterateurJoueur.hasNext()) {
                joueurCourant = iterateurJoueur.next();

                System.out.println("Tour du joueur : " + joueurCourant);

                if (simulationJoueur.utiliserJeton(plateau, joueurCourant)) {
                    System.out.println(" -> Tentative d'utilisation de jeton");
                    try {
                        joueurCourant.utiliserJeton(plateau);
                    } catch (AucunJetonUtilisableException ex) {
                        System.out.println(ex.getMessage());
                    } catch (CarteOccupeeException coe) {
                        System.out.println(coe.getMessage());
                    }
                }

                Cochon cochonSelectionne = simulationJoueur.selectionnerCochon(joueurCourant);

                System.out.println("\tChoix du cochon : " + cochonSelectionne);

                try {
                    joueurCourant.jouer(plateau, cochonSelectionne);
                    System.out.println("Fin tour cochon");
                } catch (DernierEmplacementAtteintException ex) {
                    System.out.println("Cochon " + cochonSelectionne + " gagne !");
                    joueurCourant.removeCochon(cochonSelectionne);
                    if (joueurCourant.nombreCochon() == 0) {
                       iterateurJoueur.remove();
                    }
                }
            }
        }
        System.out.println("-- Fin du jeu --");
    }
}
